#include "../../mqserver/mq_message.hpp"
#include <gtest/gtest.h>

bitmq::MessageManager::ptr msgp;

class MessageTest : public testing::Environment
{
public:
    virtual void SetUp() override
    {
        msgp = std::make_shared<bitmq::MessageManager>("./data/message/");
        msgp->initQueueMessage("queue1");
    }

    virtual void TearDown() override 
    {
        //msgp->clear();
    }
};

// TEST(message_test, recovery_test)
// {
//     bitmq::MessagePtr msg1 = msgp->front("queue1");
//     ASSERT_NE(msg1.get(), nullptr);
//     ASSERT_EQ(msg1->payload().body(), std::string("Hello World-1"));
//     //只持久化了五个数据，重启系统后，可推送消息只有5个。
//     DLOG("msg1的uuid为: %s   body: %s   valid: %s  routing_key: %s", msg1->payload().properties().id().c_str(), msg1->payload().body().c_str(), msg1->payload().valid().c_str(), msg1->payload().properties().routing_key().c_str());
//     ASSERT_EQ(msgp->getable_count("queue1"), 4);
//     ASSERT_EQ(msgp->waitack_count("queue1"), 1);

//     bitmq::MessagePtr msg2 = msgp->front("queue1");
//     ASSERT_NE(msg2.get(), nullptr);
//     ASSERT_EQ(msg2->payload().body(), std::string("Hello World-2"));
//     DLOG("msg1的uuid为: %s   body: %s   valid: %s  routing_key: %s", msg2->payload().properties().id().c_str(), msg2->payload().body().c_str(), msg2->payload().valid().c_str(), msg2->payload().properties().routing_key().c_str());
//     ASSERT_EQ(msgp->getable_count("queue1"), 3);
//     ASSERT_EQ(msgp->waitack_count("queue1"), 2);
    
//     bitmq::MessagePtr msg3 = msgp->front("queue1");
//     ASSERT_NE(msg3.get(), nullptr);
//     ASSERT_EQ(msg3->payload().body(), std::string("Hello World-3"));
//     ASSERT_EQ(msgp->getable_count("queue1"), 2);
//     ASSERT_EQ(msgp->waitack_count("queue1"), 3);
    
//     bitmq::MessagePtr msg4 = msgp->front("queue1");
//     ASSERT_NE(msg4.get(), nullptr);
//     ASSERT_EQ(msg4->payload().body(), std::string("Hello World-5"));
//     ASSERT_EQ(msgp->getable_count("queue1"), 1);
//     ASSERT_EQ(msgp->waitack_count("queue1"), 4);
    
//     bitmq::MessagePtr msg5 = msgp->front("queue1");
//     ASSERT_NE(msg5.get(), nullptr);
//     ASSERT_EQ(msg5->payload().body(), std::string("Hello World-6"));
//     ASSERT_EQ(msgp->getable_count("queue1"), 0);
//     ASSERT_EQ(msgp->waitack_count("queue1"), 5);
    
//     bitmq::MessagePtr msg6 = msgp->front("queue1");
//     ASSERT_EQ(msg6.get(), nullptr);
// }

// TEST(message_test, insert_test)
// {
//     bitmq::BasicProperties bp;
//     bp.set_id(bitmq::UUIDHelper::uuid());
//     bp.set_delivery_mode(bitmq::DeliveryMode::DURABLE);
//     bp.set_routing_key("news.music.pop");
//     msgp->insert("queue1", &bp, "Hello World-1", bitmq::DeliveryMode::DURABLE);
//     msgp->insert("queue1", nullptr, "Hello World-2", bitmq::DeliveryMode::DURABLE);
//     msgp->insert("queue1", nullptr, "Hello World-3", bitmq::DeliveryMode::DURABLE);
//     msgp->insert("queue1", nullptr, "Hello World-4", bitmq::DeliveryMode::UNDURABLE);
//     msgp->insert("queue1", nullptr, "Hello World-5", bitmq::DeliveryMode::DURABLE);
//     msgp->insert("queue1", nullptr, "Hello World-6", bitmq::DeliveryMode::DURABLE);
//     ASSERT_EQ(msgp->total_count("queue1"), 5);
//     ASSERT_EQ(msgp->durable_count("queue1"), 5);
//     ASSERT_EQ(msgp->getable_count("queue1"), 6);
//     ASSERT_EQ(msgp->waitack_count("queue1"), 0);
// }

// TEST(message_test, select_test)
// {
//     bitmq::MessagePtr msg1 = msgp->front("queue1");
//     ASSERT_NE(msg1.get(), nullptr);
//     ASSERT_EQ(msg1->payload().body(), std::string("Hello World-1"));
//     ASSERT_EQ(msgp->getable_count("queue1"), 5);
//     ASSERT_EQ(msgp->waitack_count("queue1"), 1);

//     bitmq::MessagePtr msg2 = msgp->front("queue1");
//     ASSERT_NE(msg2.get(), nullptr);
//     ASSERT_EQ(msg2->payload().body(), std::string("Hello World-2"));
//     ASSERT_EQ(msgp->getable_count("queue1"), 4);
//     ASSERT_EQ(msgp->waitack_count("queue1"), 2);
    
//     bitmq::MessagePtr msg3 = msgp->front("queue1");
//     ASSERT_NE(msg3.get(), nullptr);
//     ASSERT_EQ(msg3->payload().body(), std::string("Hello World-3"));
//     ASSERT_EQ(msgp->getable_count("queue1"), 3);
//     ASSERT_EQ(msgp->waitack_count("queue1"), 3);
    
//     bitmq::MessagePtr msg4 = msgp->front("queue1");
//     ASSERT_NE(msg4.get(), nullptr);
//     ASSERT_EQ(msg4->payload().body(), std::string("Hello World-4"));
//     ASSERT_EQ(msgp->getable_count("queue1"), 2);
//     ASSERT_EQ(msgp->waitack_count("queue1"), 4);
    
//     bitmq::MessagePtr msg5 = msgp->front("queue1");
//     ASSERT_NE(msg5.get(), nullptr);
//     ASSERT_EQ(msg5->payload().body(), std::string("Hello World-5"));
//     ASSERT_EQ(msgp->getable_count("queue1"), 1);
//     ASSERT_EQ(msgp->waitack_count("queue1"), 5);
    
//     bitmq::MessagePtr msg6 = msgp->front("queue1");
//     ASSERT_NE(msg6.get(), nullptr);
//     ASSERT_EQ(msg6->payload().body(), std::string("Hello World-6"));
//     ASSERT_EQ(msgp->getable_count("queue1"), 0);
//     ASSERT_EQ(msgp->waitack_count("queue1"), 6);

//     bitmq::MessagePtr msg7 = msgp->front("queue1");
//     ASSERT_EQ(msg7.get(), nullptr);
// }

//删除消息测试
// TEST(message_test, remove_test)
// {
//     bitmq::MessagePtr msg1 = msgp->front("queue1");
//     ASSERT_NE(msg1.get(), nullptr);
//     ASSERT_EQ(msg1->payload().body(), std::string("Hello World-1"));
//     ASSERT_EQ(msgp->getable_count("queue1"), 4);
//     ASSERT_EQ(msgp->waitack_count("queue1"), 1);
//     msgp->ack("queue1", msg1->payload().properties().id());
//     ASSERT_EQ(msgp->waitack_count("queue1"), 0);
//     ASSERT_EQ(msgp->durable_count("queue1"), 4);
//     ASSERT_EQ(msgp->total_count("queue1"), 5);  //删除消息后，总量并不变，而是等垃圾回收时才会修改
// }

TEST(message_test, gc_test)
{
    ASSERT_EQ(msgp->getable_count("queue1"), 4);
    ASSERT_EQ(msgp->waitack_count("queue1"), 0);
    bitmq::MessagePtr msg1 = msgp->front("queue1");
    ASSERT_NE(msg1.get(), nullptr);
    ASSERT_EQ(msg1->payload().body(), std::string("Hello World-2"));
    //只持久化了五个数据，重启系统后，可推送消息只有5个。
    ASSERT_EQ(msgp->getable_count("queue1"), 3);
    ASSERT_EQ(msgp->waitack_count("queue1"), 1);
}

// TEST(message_test, clear_test)
// {
//     msgp->destroyQueueMessage("queue1");
// }

int main(int argc, char* argv[])
{
    testing::InitGoogleTest(&argc, argv);
    testing::AddGlobalTestEnvironment(new MessageTest);
    RUN_ALL_TESTS();
    return 0;
}